package com.woniuxy.mqdemo;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Author: 马宇航
 * @Todo: 消费者的开发
 * 1. 消费者不需要声明队列，但是要指定消费队列的名字
 * 2. 连接，信道，都一样。
 * @DateTime: 25/08/29/星期五 11:29
 * @Component: 成都蜗牛学苑
 **/
public class ConsumerMessage {
    private static final String QUEUE_NAME = "java115_demo1";
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.第一步，实例化工厂，后期就交给springboot的yml和自动配置类来实现
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.115.5");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        //虚拟环境
        connectionFactory.setVirtualHost("java115");
        //2.第二步，创建连接，连接创建信道 channel
        Connection connection = connectionFactory.newConnection();
        Channel channel = connection.createChannel();
        //3.第三步，消费这个队列的消息
        channel.basicConsume(QUEUE_NAME,false,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //打印消息
                System.out.println(new String(body));
                //打印标签
                System.out.println(consumerTag);
                //打印消息的id
                System.out.println(envelope);
                //消费第一个消息，不消费第二个
                if (envelope.getDeliveryTag() == 1){
                    //手动应答 basicAck 就是手动确认消息
                    channel.basicAck(envelope.getDeliveryTag(),false);
                }else {
                    //手动nack 不应答，就算不确认消息，不消费消息，requeue=true 会退回去。
                    //由于是持续监听，所以，退回去，又接收到消息，但是又消费不了，又退回去。
                    channel.basicNack(envelope.getDeliveryTag(),false,false);
                }
                //打印properties
                System.out.println(properties);
            }
        });
    }
}
